package com.deppon.vts.data.plugin;

import javax.annotation.PostConstruct;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisFactory {
	@Value("redis.ip")
	private String ip;
	@Value("#{new Integer('${redis.port}')}")
	private Integer port;
	@Value("redis.pass")
	private String password;
    //可用连接实例的最大数目，默认值为8；
    //如果赋值为-1，则表示不限制；如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)。
	@Value("#{new Integer('${redis.active}')}")
    private int maxActive = 10;
    //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例，默认值也是8。
	@Value("#{new Integer('${redis.idle}')}")
    private int maxIdle = 20;
    //等待可用连接的最大时间，单位毫秒，默认值为-1，表示永不超时。如果超过等待时间，则直接抛出JedisConnectionException；
	@Value("#{new Integer('${redis.wait}')}")
    private int maxWait = 10000;
	@Value("#{new Integer('${redis.timeout}')}")
    private int timeOut = 10000;
    //在borrow一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的；
    private boolean testOnBorrow = true;
    
    private static JedisPool jedisPool;
    
    @PostConstruct
    public void init(){
    	try {
			JedisPoolConfig config = new JedisPoolConfig();
			config.setMaxActive(maxActive);
			config.setMaxIdle(maxIdle);
			config.setMaxWait(maxWait);
			config.setTestOnBorrow(testOnBorrow);
			if(StringUtils.isNotBlank(password))
				jedisPool = new JedisPool(config, ip, port, timeOut, password);
			else
				jedisPool = new JedisPool(config, ip, port, timeOut);
		} catch (Exception e) {
			e.printStackTrace();
		}
    }
    
    public static synchronized Jedis getJedis() {
		try {
            if (jedisPool != null) {
                Jedis resource = jedisPool.getResource();
                return resource;
            } else {
                return null;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * 释放jedis资源
     * @param jedis
     */
    public static void returnResource(final Jedis jedis) {
        if (jedis != null) {
            jedisPool.returnResource(jedis);
        }
    }
    
}
